#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <omp.h>

#define TAM_PALAVRA 70
#define TAM_BLOCO 200

int busca_palindromo(char *s);
int verificador(char *s);
int verifica_primo(int valor);
void verifica_bloco(char *frase, char **palavra, int *num);


int main (int argc, char *argv[])
{
   // int id, nthreads;
   // omp_set_num_threads(4);
   int i, aux1 = 0;
   char frase[TAM_BLOCO], *palavra[TAM_PALAVRA];
   int count2=0,valor=0,count1=0;

   FILE *arq_grand;
   arq_grand = fopen("wikipedia.txt","r");

   if (arq_grand!=NULL)//exception
   {
     while(!feof(arq_grand))
     {
       fgets(frase,TAM_BLOCO,arq_grand);
       //printf("%s\n",frase);

       verifica_bloco(frase,palavra,&i);

       for(aux1 = 0;aux1 < i;aux1++)
       {
          valor= verificador(palavra[aux1]);
         if(valor!=0)
         {  count1++;
             if (verifica_primo(valor))
                count2++;
         }
       }
     }
     printf("\nPalindromos Quant %d\n PRIMOs Quant: %d\n",count1,count2);
   }
   fclose(arq_grand);
   return 0;
}

//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------

void verifica_bloco(char *frase, char **palavra, int *num)
{
	int m = 0;

        char *palavra_aux = strtok(frase, " ,./?'\";:|^-!$#@`~*&%)(+=_}{][\n\r\t\\");

        while(palavra_aux != NULL){
                palavra[m] = palavra_aux;
                palavra_aux = strtok(NULL, " ,./?'\";:|^-!$#@`~*&%)(+=_}{][\n\r\t\\");
                m++;
        }
        *num = m;
}


int verificador(char *s)
{
    int i,j=0,test=0;
    char bloco[200];

    for(i=0; i < strlen(s); i++) //s[i] != '\0'
    {
         if (isupper(s[i]))//maiusculo->minusculo
         {
            s[i] += 32;
            bloco[j++] = s[i];
         }
         else if(isdigit(s[i]) || islower(s[i]))
         {
            bloco[j++] = s[i];
         }
         else
            bloco[j] = '\0';
    }
   // printf("%s\n",bloco);

   test=busca_palindromo(bloco);
   //printf("test %d\n",test);

   return test;
}


int busca_palindromo(char *s)
{
   int i,l,count=0;
   l = strlen(s);

   //printf("%d\n",l);
   if (l==0)
      return 0;

   for(i=0; i<l/2; i++) //para palindromo par
   { //printf("%d\n",l/2);

     if ( s[i] == s[l-i-1] )
      {//printf("char1 %c\n char2 %c\n",s[i],s[l-i-1]);
        count += s[i];
        count += s[l-i-1];
      }
      else
        return 0;
   }
   if(l%2 == 1)//para palindromo impar soma o termo do meio
     return (count + s[l/2]);

   else
     return count;
}


int verifica_primo(int valor)
{
    int primes[15000], /* suficiente para esse programa */
        next,
        root,
        total,
        prime,
        i;

    primes[0] = total = 2;
    primes[1] = 3;
    next = 5;
    while(next <= valor)
    {
        root = sqrt(next) + 1;
        prime = 1;
        for(i = 0; (primes[i] <= root) && (i < total); i++){
            if(next % primes[i] == 0)
            {
                prime = 0;
                break;
            }
        }
        if(prime)
        {
            primes[total] = next;
            total++;
        }
        next += 2;
    }
    if(valor == 2 || valor == 3)
        return 1;
    else
        return (primes[total - 1] == valor);
}
